package com.hoo.util;

import com.hoo.common.constant.Constant;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateUtils {


    /**
     * 获得当前时间，格式 yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getCurrentDate() {
        return getCurrentDate(Constant.DATE_FORMAT_LONG_ONE);
    }

    /**
     * 获得当前时间，格式自定义
     *
     * @param format
     * @return
     */
    public static String getCurrentDate(String format) {
        Calendar day = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }
    public static String getDateString(Date date){
    	SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMddhhddss");
    	return simpleDateFormat.format(date);
    }
    

    /**
     * 获得昨天时间，格式自定义
     *
     * @param format
     * @return
     */
    public static String getYesterdayDate(String format) {
        Calendar day = Calendar.getInstance();
        day.add(Calendar.DATE, -1);
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(day.getTime());
    }

    /**
     * 获取每个月的第一天时间
     *
     * @param year
     * @param month
     * @return
     */
    public static String getFirstDayOfMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(year, month, 1, 0, 0, 0);
        c.add(Calendar.MONTH, -1);
        c.set(Calendar.DAY_OF_MONTH, c.getMinimum(Calendar.DAY_OF_MONTH));
        SimpleDateFormat sdf = new SimpleDateFormat(Constant.DATE_FORMAT_LONG_ONE);
        return sdf.format(c.getTime());
    }

    /**
     * 获取每个月的最后一天时间
     * @param year
     * @param month
     * @return
     */
    public static String getLastDayOfMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(year, month, 1, 23, 59, 59);
        c.add(Calendar.MONTH, -1);
        c.set(Calendar.DAY_OF_MONTH, c.getMaximum(Calendar.DAY_OF_MONTH));
        SimpleDateFormat sdf = new SimpleDateFormat(Constant.DATE_FORMAT_LONG_ONE);
        return sdf.format(c.getTime());
    }

    public static String getDateString(String date, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.format(new SimpleDateFormat(Constant.DATE_FORMAT_LONG_ONE).parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
            return "";
        }
    }

    public static String getDateString(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    public static Date getDate(String date, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(date);
    }

    /**
     * 开始时间, yyyy-MM-dd 00:00:00
     *
     * @param date
     * @return
     */
    public static String beginOfDate(String date) {
        return addTime("00:00:00", date);
    }

    /**
     * 结束时间, yyyy-MM-dd 00:00:00
     *
     * @param date
     * @return
     */
    public static String endOfDate(String date) {
        return addTime("23:59:59", date);
    }
  
    /**
     * 添加时间，date+" "+time
     *
     * @param time 时间
     * @param date 日期
     * @return
     */
    public static String addTime(String time, String date) {
        if (StringUtils.isBlank(date)) {
            return date;
        }
        return String.format("%s %s", date, time);
    }

    /**
     * *
     *
     * @param startTime
     * @param endTime
     * @return short 返回类型
     * @throws
     * @Description: 检查是否跨月时间
     * @Title: validateTime
     * @author of165
     * @date 2012-12-5下午5:12:34
     * @since CodingExample　Ver(编码范例查看) 1.1
     */
    public static short validateTime(String startTime, String endTime) {
        short flag = -1;
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_LONG_ONE);

            Calendar startCalendar = new GregorianCalendar();
            startCalendar.setTime(dateFormat.parse(startTime));
            Calendar endCalendar = new GregorianCalendar();
            endCalendar.setTime(dateFormat.parse(endTime));

            int startmonth = startCalendar.get(Calendar.MONTH);
            int endmonth = endCalendar.get(Calendar.MONTH);

            // 开始时间不能大于结束时间
            if (startCalendar.after(endCalendar)) {
                flag = -1;
            } else if (startmonth != endmonth) {
                if (((endmonth - startmonth + 12) % 12) > 5) { // 时间超过半年
                    flag = 0;
                } else {
                    flag = 1;
                }
            } else {
                flag = 1;
            }
        } catch (Exception e) {
            System.err.println("时间格式不对!");
        }

        return flag;
    }

    /**
     * @deprecated 判断结束时间不能早于开始时间
     */

    public static boolean compareTime(String startTime, String endTime) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_LONG_ONE);

            Calendar startCalendar = new GregorianCalendar();
            startCalendar.setTime(dateFormat.parse(startTime));
            Calendar endCalendar = new GregorianCalendar();
            endCalendar.setTime(dateFormat.parse(endTime));

            if (startCalendar.before(endCalendar)) {
                return true;
            }

        } catch (Exception e) {
            System.err.println("时间格式不对!");
        }
        return false;

    }

    /**
     * 时间跨度校验，校验是否跨月
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @throws
     * @Description:
     * @Title: validate_out_of_month
     * @date 2013-3-2上午10:41:00
     * @since CodingExample　Ver(编码范例查看) 1.1
     */
    @SuppressWarnings("deprecation")
    public static void validate_out_of_month(String startTime, String endTime) {
        try {
            Date start = DateUtils.getDate(startTime, Constant.DATE_FORMAT_LONG_ONE);
            Date end = DateUtils.getDate(endTime, Constant.DATE_FORMAT_LONG_ONE);
            Date now = new Date();
            if (now.getTime() < start.getTime()) {
                throw new RuntimeException("查询时间不能早于当前的时间");
            }
            if (end.getTime() < start.getTime()) {
                throw new RuntimeException("开始时间不能早于结束时间");
            }
            if (start.getYear() != end.getYear() || start.getMonth() != end.getMonth()) {
                throw new RuntimeException("不能跨月查询");
            }
            if ((now.getYear() * 12 + now.getMonth() - start.getYear() * 12 - start.getMonth()) > 6) {
                throw new RuntimeException("不能查询6个月之前的数据");
            }
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("时间参数校验失败");
        }
    }


    /**
     * 时间跨度校验，校验时间跨度是否超过N个月
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param month     不能超过的月数
     * @throws
     * @Description:
     * @Title: validate_out_of_month
     * @date 2013-3-2上午10:41:43
     * @since CodingExample　Ver(编码范例查看) 1.1
     */
    public static void validate_out_of_month(String startTime, String endTime, int month) {
        try {
            Date start = DateUtils.getDate(startTime, Constant.DATE_FORMAT_LONG_ONE);
            Date end = DateUtils.getDate(endTime, Constant.DATE_FORMAT_LONG_ONE);
            if (System.currentTimeMillis() < start.getTime()) {
                throw new RuntimeException("查询时间不能早于现在的时间");
            }
            if (end.getTime() < start.getTime()) {
                throw new RuntimeException("开始时间不能早于结束时间");
            }
            long times = month * 31L * Constant.DAY;
            if ((end.getTime() - start.getTime()) / 1000 >= times) {
                throw new RuntimeException("时间跨度不能超过" + month + "月");
            }
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("时间参数校验失败");
        }
    }

    /**
     * 得到本月的第一天
     *
     * @return
     */
    public static String getMonthFirstDay() {
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.DATE, 1);
        SimpleDateFormat simpleFormate = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleFormate.format(calendar.getTime());
    }

    /**
     * 得到本月的最后一天
     *
     * @return
     */
    public static String getMonthLastDay() {
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.DATE, 1);
        calendar.roll(Calendar.DATE, -1);
        SimpleDateFormat simpleFormate = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleFormate.format(calendar.getTime());
    }

    /**
     * 得到当前日期的上个月日期
     *
     * @return
     */
    public static String getOneMonthBeforeDay() {
        Calendar cal = Calendar.getInstance();//当前日期
        cal.add(Calendar.MONTH, -1);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleDateFormat.format(cal.getTime());
    }


    /**
     * 得到当前日期的三个月前日期
     *
     * @return
     */
    public static String getThreeMonthBeforeDay() {
        Calendar cal = Calendar.getInstance();//当前日期
        cal.add(Calendar.MONTH, -3);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleDateFormat.format(cal.getTime());
    }

    /**
     * 得到当前日期的六个月前日期
     *
     * @return
     */
    public static String getSixMonthBeforeDay() {
        Calendar cal = Calendar.getInstance();//当前日期
        cal.add(Calendar.MONTH, -6);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleDateFormat.format(cal.getTime());
    }


    /**
     * 得到最近一星期的日期
     *
     * @return
     */
    public static String getSevenBeforeDay() {
        Calendar cal = Calendar.getInstance();//当前日期
        cal.add(Calendar.DATE, -7);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constant.DATE_FORMAT_SIMPLE);
        return simpleDateFormat.format(cal.getTime());
    }

    /**
     * 根据type 设置时间 ：1今天，2 最近一周，3最近一个月，4自定义
     *
     * @param startTime
     * @param type
     */
    public static String getStartTime(String startTime, String type) {
        // 今天
        if ("1".equals(type)) {
            return beginOfDate(getCurrentDate(Constant.DATE_FORMAT_SIMPLE));

        } else if ("2".equals(type)) {

            return beginOfDate(getSevenBeforeDay());

        } else if ("3".equals(type)) {

            return beginOfDate(getOneMonthBeforeDay());

        } else {

            return beginOfDate(startTime);

        }


    }

    /**
     * 根据type 设置时间 ：1今天，2 最近一周，3最近一个月，4自定义
     *
     * @param endTime
     * @param type
     */
    public static String getEndTime(String endTime, String type) {
        // 今天
        if ("4".equals(type)) {
            return endOfDate(endTime);
        } else {
            return endOfDate(getCurrentDate(Constant.DATE_FORMAT_SIMPLE));
        }

    }

    public static String getAgoTime(String timeRange) {
        Date now = new Date();
        Date date = new Date();
        if ("5s".equals(timeRange)) {
            //2min
            date.setTime(now.getTime() - 5 * Constant.SECOND_OF_MILLI); //5秒设置

        } else if ("10s".equals(timeRange)) {
            //2min
            date.setTime(now.getTime() - 10 * Constant.SECOND_OF_MILLI); //5秒设置

        } else if ("2m".equals(timeRange)) {
            //2min
            date.setTime(now.getTime() - 2 * Constant.MINUTE_OF_MILLI); //2分钟设置

        } else if ("1m".equals(timeRange)) {
            //2min
            date.setTime(now.getTime() - Constant.MINUTE_OF_MILLI); //1分钟设置

        } else if ("1".equals(timeRange)) {
            //半小时
            date.setTime(now.getTime() - 30 * Constant.MINUTE_OF_MILLI); //分钟设置

        } else if ("2".equals(timeRange)) {
            //1小时
            date.setTime(now.getTime() - 1 * Constant.HOUR_OF_MILLI); //把时间设置为当前时间-1小时，同理，也可以设置其他时间

        } else {
            //2小时
            date.setTime(now.getTime() - 2 * Constant.HOUR_OF_MILLI); //把时间设置为当前时间-2小时，同理，也可以设置其他时间

        }

        return getDateString(date, Constant.DATE_FORMAT_LONG_ONE);
    }

    public static int getAge(Date birthDay) throws Exception { 
        //获取当前系统时间
        Calendar cal = Calendar.getInstance(); 
        //如果出生日期大于当前时间，则抛出异常
        if (cal.before(birthDay)) { 
            throw new IllegalArgumentException( 
                "The birthDay is before Now.It's unbelievable!"); 
        } 
        //取出系统当前时间的年、月、日部分
        int yearNow = cal.get(Calendar.YEAR); 
        int monthNow = cal.get(Calendar.MONTH); 
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); 
         
        //将日期设置为出生日期
        cal.setTime(birthDay); 
        //取出出生日期的年、月、日部分  
        int yearBirth = cal.get(Calendar.YEAR); 
        int monthBirth = cal.get(Calendar.MONTH); 
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); 
        //当前年份与出生年份相减，初步计算年龄
        int age = yearNow - yearBirth; 
        //当前月份与出生日期的月份相比，如果月份小于出生月份，则年龄上减1，表示不满多少周岁
        if (monthNow <= monthBirth) { 
            //如果月份相等，在比较日期，如果当前日，小于出生日，也减1，表示不满多少周岁
            if (monthNow == monthBirth) { 
                if (dayOfMonthNow < dayOfMonthBirth) age--; 
            }else{ 
                age--; 
            } 
        } 
        return age; 
    }
    
}
